import axios from 'axios';
import {ElMessage} from "element-plus";
import { useSetting } from '@/stores/setting';

const apiClient = axios.create({
    // 所有请求直接使用相对路径，可由各接口自行添加 /api 前缀
    baseURL: 'http://localhost:8080',
    timeout: 10000,
});


apiClient.interceptors.request.use(
    (config) => {
        // 保留扩展点：可在此添加认证 Token 等
        // 若启用本地数据库模式，则将部分业务接口自动映射至 /db 路径
        const settingStore = useSetting();
        if (settingStore.useDb && config.url) {
            const url = config.url;
            if (!url.includes('/db')) {
                if (/^\/api\/agv\/config(\/|$)/.test(url)) {
                    config.url = url.replace(/^\/api\/agv\/config/, '/api/agv/config/db');
                } else if (/^\/api\/agv\/flaw(\/|$)/.test(url)) {
                    config.url = url.replace(/^\/api\/agv\/flaw/, '/api/agv/flaw/db');
                } else if (/^\/api\/agv\/task(\/|$)/.test(url)) {
                    config.url = url.replace(/^\/api\/agv\/task/, '/api/agv/task/db');
                }
            }
        }
        return config;
    },
    (error) => Promise.reject(error)
);

apiClient.interceptors.response.use(
    (response) => {
        const res = response.data;

        // 若带有跳过同步头则直接返回
        if (response.config.headers && (response.config.headers as any)['X-Skip-Db-Sync']) {
            return res;
        }

        // 若后端按统一返回结构包装
        if (typeof res.code !== 'undefined') {
            if (res.code === 200 || res.code === 0) {
                return res; // 业务成功，直接返回包装结构
            }

            // 业务失败，给出提示并中断 Promise 链
            ElMessage.error(res.msg || '业务处理失败');
            return Promise.reject(new Error(res.msg || 'Error'));
        }

        // 兼容文件流等非标准响应
        return res;
    },
    (error) => {
        let message = '发生未知错误';

        if (error.response) {
            const status = error.response.status;
            switch (status) {
                case 400:
                    message = '请求参数错误';
                    break;
                case 401:
                    message = '未授权，请重新登录';
                    break;
                case 403:
                    message = '拒绝访问';
                    break;
                case 404:
                    message = `请求地址不存在: ${error.response.config.url}`;
                    break;
                case 500:
                    message = '服务器内部错误';
                    break;
                default:
                    message = `连接错误 (${status})`;
            }
        } else if (error.code === 'ECONNABORTED' || (error.message && error.message.includes('timeout'))) {
            message = '请求超时，请检查网络连接';
        } else if (error.message && error.message.includes('Network Error')) {
            message = '网络错误，无法连接到服务器';
        }

        ElMessage.error(message);
        return Promise.reject(error);
    }
);

export default apiClient;